﻿/*
    为所有网页上的组件（Ext.Component的实例或子类实例）提供一个注册表，使它们能
用组件id很方便地访问到(参考get方法或Ext.getCmp方法)。
    所有可用xtypes的列表，请参阅Ext.Component。
    该类是一个单例，不能直接被创建
*/
Ext.ComponentMgr = new Ext.AbstractManager({
    typeName: 'xtype',

    //config：一个要创建的组件的配置对象
    //defaultType：默认的组件类型，（如果config包含了一个xtype属性，着该参数可选）
    //返回值：新的实例化的组件
    create: function (config, defaultType) {
        if (config.isComponent) {
            return config;
        } else {
            var type = config.xtype || defaultType,
                Class = this.types[type];
            if (!Class) {
                throw "Attempting to create a component with an xtype that has not been registered: " + type
            }
            return new Class(config);
        }
        return config.render ? config : new (config);
    },

    //注册一个新组件的构造器，以一个新的Ext.Component.xtype为键。
    //使用这种方法（别名为Ext.reg）登记Ext.Component的新子类，
    //能够在指定子组件时进行的懒加载中使用
    //type：xtype对应的助记符，通过此助记符找到组件
    //cls：新的组件
    registerType: function (type, cls) {
        this.types[type] = cls;
        cls[this.typeName] = type;
        cls.prototype[this.typeName] = type;
    }
});